package main

import (
	"fmt"
	"reflect"
)

func main() {
	// 对结构体进行反射
	stu := Student {
		Name: "张三",
		Age: 18,
	}

	reflectStruct(stu)

}

func reflectStruct(i interface{}) {
	// teypOf
	reValue := reflect.ValueOf(i)

	// 获取结构体内部字段数
	fieldNum := reValue.NumField()
	fmt.Println("结构体内部字段数: ", fieldNum)
	for i := 0; i < fieldNum; i++ {
		fmt.Printf("第%d个字段的值是: %v \n", i + 1, reValue.Field(i))
	}
	
	methodNum := reValue.NumMethod()
	fmt.Println("结构体内部方法数: ", methodNum)
	// 调用方法
	reValue.Method(1).Call(nil)

	var params []reflect.Value
	params = append(params, reflect.ValueOf(10))
	params = append(params, reflect.ValueOf(20))
	result := reValue.Method(0).Call(params)
	fmt.Println("GetSum: ", result[0].Int())

}

// 结构体及绑定的方法
type Student struct{
	Name string
	Age int
}

func (s Student) Print() {
	fmt.Println("调用Print()")
	fmt.Println("学生的姓名：", s.Name)
}

func (s Student) GetSum(n1, n2 int) int {
	fmt.Println("调用GetSum()")
	return n1 + n2
}